Открытая платформа для создания заботливой квартиры
Это датчик, который принимает два состояния: включено или выключено, в результате обнаружения теплового излучения в его поле зрения. С использованием такого сенсора можно организовать сценарий, который будет отслеживать появление людей в комнате или управлять автоматическим включением и отключением света.
Применение инфракрасного датчика внутри помещений не всегда оправдано. Лучше их использовать на улице, где есть много движущихся, но нетеплокровных объектов - деревья, машины и т.п. В домашних условиях вполне подойдет датчик с использованием радиомодуля (на базе доплеровского эффекта).
Итак, вам потребуются следующие компоненты:
Название | Назначение | Цена, руб. |
---|---|---|
BLE CC41A | Радиомодуль Bluetooth LE | 140 |
HC-SR505 | Мини-датчик движения инфракрасный | 75 |
Digispark ATTiny85 | Микроконтроллер для снятия показаний датчика движения | 80 |
Помимо того, что датчик интегрирован с инфраструктурой умного дома, его преимущества еще и в том, что он в три раза дешевле китайского датчика движения, его не нужно прикреплять к потолку или стене, его можно разместить в любом удобном месте, ведь он работает от батареек.
Располагайте датчик движения с учетом того, что он отслеживает движение на расстоянии 4-5 метров. В режиме ожидания датчик потребляет около 1мА, так что батареек должно хватить на продолжительную работу устройства. Питание 5В необходимо для устойчивой работы датчика движения. Иначе можно было бы обойтись 2-мя элементами питания.
Программирование
Подготовьте рабочее место для работы с DigiSpark ATTiny85 по этой инструкции и запрограммируйте микроконтроллер с использованием этого кода:
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <cc41a.h>
#define adc_disable() (ADCSRA &= ~_BV(ADEN))
#define adc_enable() (ADCSRA |= _BV(ADEN))
#define SWITCH_PIN PB2
#define TX_DELAY 200
int wasState = LOW;
int secondsToWait = 0;
CC41A ble(PB1, PB3, PB0); // RX, TX, Reset
void setup()
{
setupPins();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
initializeWatchdogTimer(WDTO_1S);
ble.configure("Motion-1");
}
void loop()
{
setupPins();
power_all_disable();
adc_disable();
sleep_mode();
if ( secondsToWait > 0 ) {
secondsToWait--;
return;
}
int nowState = digitalRead(SWITCH_PIN);
if ( nowState == wasState) return;
power_all_enable();
ble.major(nowState == HIGH ? 1 : 0);
wasState = nowState;
secondsToWait = 10;
}
void initializeWatchdogTimer(byte sleep_time)
{
wdt_reset();
wdt_enable(sleep_time);
WDTCR |= _BV(WDIE);
}
ISR(WDT_vect) {
WDTCR |= _BV(WDIE);
}
void setupPins()
{
pinMode(0, OUTPUT);
digitalWrite(0, LOW);
pinMode(0, INPUT);
pinMode(1, OUTPUT);
digitalWrite(1, LOW);
pinMode(1, INPUT);
pinMode(A1,INPUT);
analogWrite(A1, 0);
pinMode(A2,INPUT);
analogWrite(A2, 0);
pinMode(A3,INPUT);
analogWrite(A3, 0);
}
Схема устройства
Настройка HASS
Файл: /config/configuration.yaml
binary_sensor:
- platform: cutecare
name: Motion detector
mac: 3c:a3:08:c6:82:10
Файл: /config/customize.yaml
binary_sensor.motion_detector:
friendly_name: Движение
Файл: /config/groups.yaml
default_view:
view: yes
icon: mdi:home
entities:
- group.hall
- group.kitchen
- group.bedroom
kitchen:
name: Кухня
entities:
- binary_sensor.motion_detector
В приложении вы сможете отслеживать изменение состояния датчика:
Автоматизация
Здесь приведен достаточно простой пример автоматизации, который включает свет на кухне при обнаружении движения и отключает его через 10 минут после последнего обнаруженного движения. Конечно, более реалистичный сценарий потребует некоторого усложнения.
Файл: /config/automations.yaml
- alias: Включить свет на кухне, если обнаружено движение
trigger:
platform: state
entity_id: binary_sensor.motion_detector
to: 'on'
action:
service: homeassistant.turn_on
entity_id: light.kitchen_light
- alias: Выключить свет на кухне через 10 минут после последнего движения
trigger:
platform: state
entity_id: binary_sensor.motion_detector
to: 'off'
for:
minutes: 10
action:
service: homeassistant.turn_off
entity_id: light.kitchen_light